package config

import (
	"context"
	"fmt"
	"github.com/redis/go-redis/v9"
	"github.com/spf13/viper"
	"github.com/xxl-job/xxl-job-executor-go"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"log"
	"time"
)

var DB *gorm.DB

var Redis *redis.Client
var Ctx = context.Background()

func InitConfig() {

	viper.SetConfigFile("config/config.yaml")
	err := viper.ReadInConfig()
	if err != nil {
		log.Fatalln("读取配置失败:", err)
	}

	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True",
		viper.GetString("mysql.user"),
		viper.GetString("mysql.password"),
		viper.GetString("mysql.host"),
		viper.GetString("mysql.port"),
		viper.GetString("mysql.db"),
	)

	DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})

	if err != nil {
		log.Fatalln("数据库连接失败", err)
	}

	host := viper.GetString("redis.host")
	port := viper.GetString("redis.port")
	password := viper.GetString("redis.password")
	db := viper.GetInt("redis.db")
	Redis = redis.NewClient(&redis.Options{
		Addr:     host + ":" + port, // 默认端口
		Password: password,          // 如果有密码写这里
		DB:       db,                // 默认使用 0 号库
	})

	if _, err := Redis.Ping(Ctx).Result(); err != nil {
		log.Fatalf("Redis 连接失败: %v", err)
	} else {
		fmt.Println("Redis 连接成功")
	}
}

func InitXXlJob() {
	// 1. 初始化执行器
	exec := xxl.NewExecutor(
		xxl.ServerAddr("http://10.10.207.11:9888/xxl-job-admin"), // 调度中心地址
		xxl.ExecutorIp("10.10.188.98"),
		xxl.ExecutorPort("9898"),
		xxl.AccessToken("default_token"),
		xxl.RegistryKey("dev-report"), // 注册名需和调度中心一致
	)

	exec.Init()

	// 2. 注册一个任务：task name 必须和控制台里配置的一致
	exec.RegTask("demoTask", func(ctx context.Context, req *xxl.RunReq) string {
		fmt.Println("💥 收到调度任务：参数 =", req.ExecutorParams)
		time.Sleep(3 * time.Second)
		return "执行成功"
	})

	// 3. 启动执行器

	exec.Run()
}
